﻿/*
 *  devHanding.c
 *  (C) 2025  Guo Xin
 *  
 *  统一处理外设调用的源文件
 */
#include "main.h"
#include "devHanding.h"
// include devices
#include "DHT11.h"
#include "adc.h"
#include "smoke.h"
#include "key.h"
#include "OLED.h"
#include "HS_F04A.h"

uint8_t temperature;	// 温度
uint8_t humidity;		// 湿度
/* 获取DHT11的测量值 */
void DHT11_getDate(void)
{
	DHT11_Read_Data(&temperature, &humidity);
	printf("温度：%d, 湿度：%d \r\n", temperature, humidity);
}


uint16_t Val;			// 烟雾传感器测量值
/* 获取烟雾传感器的测量值 */
void ADC_getDate(void)
{
	Val = Get_ADC_Value(&hadc1);		// 获取测量值
	printf("烟雾：%d \r\n", Val);

}


/* 按键情况处理函数 */
unsigned char ctrl_page = 1;
unsigned char ctrl_fan = 0;
void KEY_StatusHandling(void)
{
	Key_ID key = Key_Scan(2000); 	// 长按阈值1秒
	switch(key) {
		case KEY_NONE:
			// 无按键按下的情况
			break;
		case KEY_1:
			// 处理K1短按 OLED界面控制
			ctrl_page++;
			break;
		case KEY_2:
			// 处理K2短按 风扇控制
			ctrl_fan = ~ctrl_fan;	// 取反后ctrl_fan的值变成255
			break;
		case KEY_3:
			// 处理K3短按
			break;
		case KEY_4:
			// 处理K4短按
			break;
		case KEY_1 + 4:			// K1长按
			// 处理K1长按
			break;
		case KEY_2 + 4:			// K1长按
			// 处理K1长按
			break;
		case KEY_3 + 4:			// K1长按
			// 处理K1长按
			break;
		case KEY_4 + 4:			// K1长按
			// 处理K1长按
			break;
	}
	HAL_Delay(10); // 降低CPU占用率
}


// OLED显示屏控制函数
void OLED_handing(void)
{
	// ctrl_page越界处理
	if (ctrl_page > 3 || ctrl_page < 1)
		ctrl_page = 1;
	// ctrl_page不同情况处理
	switch (ctrl_page) {
		case 1:
			// 第一个界面 显示温湿度
			OLED_ShowString(1, 1, "humi");
			OLED_ShowNum(1, 7, humidity, 2);
			OLED_ShowString(3, 1, "temp");
			OLED_ShowNum(3, 7, temperature, 2);
			break;
		case 2:
			// 第二个界面 显示烟雾
			OLED_ShowString(1, 1, "smoke");
			OLED_ShowNum(2, 1, Val, 2);
			break;
		case 3:
			// 第三个界面 显示风扇状态
			OLED_ShowString(1, 1, "fan status");
			if (!ctrl_fan)
				OLED_ShowString(2, 1, "down");
			else
				OLED_ShowString(2, 1, "on");
			break;
	}
}


void dev_init(void)
{
	OLED_Init();
	Key_Init();
	HS_F04A_init();
	DHT11_Check();
}


// 统一调用外设
void dev_call(void)
{
	OLED_handing();				// 显示器
	KEY_StatusHandling();		// 按键
	
	DHT11_getDate();		// 温湿度取值
	ADC_getDate();			// 烟雾取值
}


